//
// Created by yonghu0 on 25-10-7.
//
#include <iostream>
#include <deque>
#include <algorithm> //copy/find的头文件
#include <iterator> //ostream_iterator头文件
int main()
{
    std::cout<<"deque_test begin"<<std::endl;

    std::cout<<"------创建deque------"<<std::endl;
    std::deque<int> dq1;
    for (std::deque<int>::iterator it = dq1.begin(); it != dq1.end(); it++)
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout<<"-------获取size------"<<std::endl;
    std::cout<<dq1.size()<<std::endl;
    std::cout<<"-------判断deque是否为空------"<<std::endl;
    std::cout<<dq1.empty()<<std::endl;

    std::cout<<"--------------增--------------"<<std::endl;
    std::cout<<"--头部添加元素--"<<std::endl;
    dq1.push_front(5);
    dq1.push_front(6);
    std::ostream_iterator<int> oit(std::cout," ");
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;
    std::cout<<"--尾部添加元素--"<<std::endl;
    dq1.push_back(3);
    dq1.push_back(2);
    dq1.push_back(1);
    dq1.push_back(4);
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;
    std::cout<<"--插入元素--"<<std::endl;
    //插入单个元素
    std::deque<int>::iterator it1=std::find(dq1.begin(),dq1.end(),2);
    std::deque<int>::iterator it2=dq1.insert(it1,99);
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;
    std::cout<<*it2<<std::endl;
    //插入区间
    int a1[]={11,12,13,14};
    std::deque<int>::iterator it3=dq1.insert(it2,a1,a1+4);
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;
    std::cout<<*it3<<std::endl;

    std::cout << "-------------查找---------------" << std::endl;
    if (std::find(dq1.begin(), dq1.end(), 2) != dq1.end())
    {
        std::cout << "容器中存在元素" << std::endl;
    }
    else
    {
        std::cout << "容器中不存在元素" << std::endl;
    }

    std::cout<<"-------------删除---------------"<<std::endl;
    std::cout<<"----头部删除元素-----"<<std::endl;
    dq1.pop_front();
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;
    std::cout<<"----尾部删除元素-----"<<std::endl;
    dq1.pop_back();
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;
    std::cout<<"----删除元素-----"<<std::endl;
    //删除单个元素
    std::deque<int>::iterator it4=dq1.erase(dq1.begin());
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;
    std::cout<<*it4<<std::endl;
    //删除区间
    std::deque<int>::iterator it5=dq1.erase(dq1.begin(),dq1.begin()+2);
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;
    std::cout<<*it5<<std::endl;

    std::cout<<"-----------------------遍历---------------------"<<std::endl;
    std::cout<<"---正向遍历---"<<std::endl;
    //方法一
    for (auto elem: dq1)
    {
        std::cout<<elem<<" ";
    }
    std::cout << std::endl;
    //方法二
    for (size_t i=0;i<dq1.size();i++)
    {
        std::cout<<dq1[i]<<" ";
    }
    std::cout<<std::endl;
    //方法三
    for (std::deque<int>::iterator it=dq1.begin();it!=dq1.end();it++)
    {
        std::cout<<*it<<" ";
    }
    std::cout<<std::endl;
    std::cout<<"---反向遍历---"<<std::endl;
    //方法一
    for (size_t i=0;i<dq1.size();i++)
    {
        std::cout<<dq1[dq1.size()-i-1]<<" ";
    }
    std::cout<<std::endl;
    //方法二
    for (std::deque<int>::reverse_iterator it=dq1.rbegin();it!=dq1.rend();it++)
    {
        std::cout<<*it<<" ";
    }
    std::cout<<std::endl;

    std::cout<<"-----------清空容器中的所有元素-------------"<<std::endl;
    dq1.clear();
    std::copy(dq1.begin(),dq1.end(),oit);
    std::cout<<std::endl;

    std::cout<<"deque_test end"<<std::endl;

    return 0;
}

